/**
 * 本地与UTC时区的时间偏移量，单位：毫秒
 */
const utcToLocalOffset = new Date().getTimezoneOffset() * 60 * 1000

const bjToLocalOffset = utcToLocalOffset + 8 * 60 * 60 * 1000

/**
 * 从UTC毫秒时间戳转换成本地时间
 * @param utcTimestamp UTC毫秒时间戳
 * @returns 本地时间
 */
export function getLocalDatetimeFromUtcTimestamp(utcTimestamp: number) {
  return new Date(utcTimestamp)
}

/**
 * 从本地时间转换成UTC毫秒时间戳
 * @param date 指定本地时间
 * @returns UTC毫秒时间戳
 */
export function getUtcTimestampFromLocalDatetime(date: Date) {
  return date.getTime()
}

/**
 * 从北京时间毫秒时间戳转换成本地时间
 * @param bjTimestamp 北京毫秒时间戳
 * @returns 本地时间
 */
export function getLocalDatetimeFromBJTimestamp(bjTimestamp: number) {
  return new Date(bjTimestamp - bjToLocalOffset)
}

/**
 * 从本地时间转换成北京时间毫秒时间戳
 * @param date 本地时间
 * @returns 北京时间毫秒时间戳
 */
export function getBJTimestampFromLocalDatetime(date: Date) {
  return date.getTime() + bjToLocalOffset
}

/**
 * 计算本地与服务端网络延时函数
 * @param clientStart 本地请求开始时间
 * @param clientEnd 本期响应到达时间
 * @param serverStart 服务端收到请求时间
 * @param serverEnd 服务端发出响应时间
 * @returns 网络延时时间
 */
export function computeLocalToServerTimeOffset(
  clientStart: number,
  clientEnd: number,
  serverStart: number,
  serverEnd: number,
): number {
  return Math.round((serverStart + serverEnd - (clientStart + clientEnd)) / 2)
}

export function format(date: Date, fmt: string): string {
  let o: any = {
    'M+': date.getMonth() + 1, // 月份
    'd+': date.getDate(), // 日
    'h+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    S: date.getMilliseconds(), // 毫秒
  }
  if (/(y+)/.test(fmt))
    fmt = fmt.replace(RegExp.$1, String(date.getFullYear()).substr(4 - RegExp.$1.length))
  Object.keys(o).forEach((k) => {
    if (new RegExp('(' + k + ')').test(fmt))
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(String(o[k]).length),
      )
  })
  return fmt
}
